#!/home/cs1010/anaconda3/envs/mqtt_admin/bin/python

from flask import Flask, render_template, request
from mqtt_core import MQTTClientWrapper
from volcengine_nh import VolcengineWrapper
import threading
import json
import random
import string

# 创建 Flask 应用实例
app = Flask(__name__)
# 全局 MQTT 客户端实例，初始为 None
mqtt_client = None
# 全局设备 火山引擎实例，初始为 None
volcengine = None
# 标记是否正在监听设备消息，初始为 False
is_publishing = False
# 存储发布线程的变量，初始为 None
publish_thread = None
# 字典用于存储设备 ID 及其对应的激活码
device_activation_codes = {}


def start_mqtt_listening():
    global mqtt_client, volcengine, is_publishing, publish_thread
    # 读取配置文件
    config_file = 'config.ini'
    # 创建 MQTT 客户端实例
    mqtt_client = MQTTClientWrapper(config_file)
    # 尝试连接到 MQTT 服务器
    if mqtt_client.connect_to_mqtt():
        # 标记为正在监听
        is_publishing = True
        # 启动一个新线程来监听设备消息，回调函数是 handle_device_id，意思是 在 on_message 中，当收到消息时，会调用 handle_device_id 函数来处理消息
        publish_thread = threading.Thread(target=mqtt_client.start_listening, args=(handle_device_id,))
        # 设置线程为守护线程，主程序退出时自动终止
        publish_thread.daemon = True
        # 启动线程
        publish_thread.start()


@app.route('/', methods=['GET', 'POST'])
def index():
    """
    处理根路由的请求，支持 GET 和 POST 方法。
    GET 请求用于显示页面，POST 请求用于处理开始和停止监听的操作。
    """
    global mqtt_client, is_publishing, publish_thread
    if request.method == 'POST':
        # 获取表单中 action 字段的值
        action = request.form.get('action')
        if action == 'start':
            # 如果当前未在监听
            if not is_publishing:
                start_mqtt_listening()
        elif action == 'stop':
            # 如果当前正在监听
            if is_publishing:
                # 停止监听
                mqtt_client.stop_listening()
                # 标记为停止监听
                is_publishing = False
    # 根据监听状态生成状态信息
    status = "正在监听设备消息" if is_publishing else "已停止监听"
    # 渲染 HTML 模板并传递状态信息
    return render_template('index.html', status=status)


def handle_device_id(device_id):
    """
    处理接收到的设备 ID，生成激活码并发布给设备。
    :param device_id: 接收到的设备 ID
    """
    global volcengine
    # # 创建火山引擎实例
    volcengine = VolcengineWrapper()
    volcengine.set_device_id(device_id)
    volcengine.start_voice_chat() # 启动语音聊天 
    if volcengine.get_is_started():
        print("Start Voice Chat Success ")
        app_id = volcengine.get_app_id()
        room_id = volcengine.get_room_id()
        uid = volcengine.get_uid()
        token = volcengine.get_token()
    else:
        print("Start Voice Chat Failed ")
        return
    # 把 app_id room_id uid token 整合成 json 格式 发送给设备
    json_data = {
        "device_id": device_id,
        "app_id": app_id,
        "room_id": room_id,
        "uid": uid,
        "token": token
    }
    # 将设备 ID 和 json 存储到字典中
    device_activation_codes[device_id] = json.dumps(json_data)
    # 调用 MQTT 客户端的方法发布激活码给设备
    mqtt_client.publish_activation_code(device_id, device_activation_codes[device_id])


# def generate_activation_code():
#     """
#     生成一个 16 位的随机激活码，包含字母和数字。
#     :return: 生成的激活码
#     """
#     # 定义可用的字符集，包含字母和数字
#     characters = string.ascii_letters + string.digits
#     # 从字符集中随机选择 16 个字符组成激活码
#     return ''.join(random.choice(characters) for i in range(16))


if __name__ == '__main__':
    # 以调试模式运行 Flask 应用
    app.run(debug=True)
    